//
//  HJHomeTableViewController.swift
//  HJWeiBo
//
//  Created by 黄珏 on 15/10/26.
//  Copyright © 2015年 黄珏. All rights reserved.
//

import UIKit
import SVProgressHUD
// 统一管理cell的ID
enum HJStatusCellIdentifier: String {
    case NormalCell = "NormalCell"
    case ForwardCell = "ForwardCell"
}
class HJHomeTableViewController: HJBaseTableViewController {

    private var status: [HJStatus]? {
        didSet{
            tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if HJUserAccount.isUerLogin == false {
//            用户没有登入
            return
        }
        setupNavigaiotnBar()
        prepareUI()
        refreshControl = HJRefreshControl()
        
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 调用beginRefreshing开始刷新,但是不会触发 ValueChanged 事件,只会让刷新控件进入刷新状态
        refreshControl?.beginRefreshing()
        
        // 代码触发 refreshControl 的 ValueChanged 事件
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
        
    }

//    private func loadData() {   注意 私有方法的话不能添加到 refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        func loadData() {
        print("开始加载数据")
        var since_id = status?.first?.id ?? 0
        var max_id = 0
        
        // 如果菊花正在转,表示 上拉加载更多数据
        if pullUpView.isAnimating() {
            // 上拉加载更多数据
            since_id = 0
            max_id = status?.last?.id ?? 0 // 设置为最后一条微博的id
        }
        
        HJStatus.loadStatus(since_id, max_id: max_id) { (status, error) -> () in
            
            // 结束刷新
            self.refreshControl?.endRefreshing()
            
            // 数据加载完成,停止上拉加载数据的菊花
            self.pullUpView.stopAnimating()
            
            if error != nil {
                SVProgressHUD.showErrorWithStatus("加载数据出错", maskType: SVProgressHUDMaskType.Black)
                return
            }
            if status == nil || status?.count == 0 {
                SVProgressHUD.showErrorWithStatus("加载不到数据", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            // 下拉刷新,显示加载了多少条微博
            if since_id > 0 {
                let count = status?.count ?? 0
                self.showTipView(count)
            }
            
            // 能到下面来说明没有错误
            if status == nil || status?.count == 0 {
                SVProgressHUD.showInfoWithStatus("没有新的微博数据", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            // 判断如果是下拉刷新,加获取到数据拼接在现有数据的前
            if since_id > 0 {   // 下拉刷新
                // 最新数据 =  新获取到的数据 + 原有的数据
                print("下拉刷新,获取到: \(status?.count)");
                self.status = status! + self.status!
            } else if max_id > 0 {  // 上拉加载更多数据
                // 最新数据 =  原有的数据 + 新获取到的数据
                print("上拉加载更多数据,获取到: \(status?.count)");
                self.status = self.status! + status!
            } else {
                // 有微博数据
                self.status = status
                print("获取最新20条数据.获取到 \(status?.count) 条微博")
            }
        }
    }
//设置导航栏
    func setupNavigaiotnBar() {
//        title = HJUserAccount.loadUserAccount()?.name ?? "没有名称"
    }
    
    func prepareUI() {
        
        // 添加footView,上拉加载更多数据的菊花
        tableView.tableFooterView = pullUpView
        
        tableView.estimatedRowHeight = 300
        tableView.registerClass(HJForwardCell.self, forCellReuseIdentifier: HJStatusCellIdentifier.ForwardCell.rawValue)
        tableView.registerClass(HJNormalCell.self, forCellReuseIdentifier: HJStatusCellIdentifier.NormalCell.rawValue)
//        tableView.rowHeight = UITableViewAutomaticDimension
    }
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return status?.count ?? 0
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let tempStatus = status![indexPath.row]
        let cell = tableView.dequeueReusableCellWithIdentifier(tempStatus.cellID()) as! HJStatusCell
        cell.status = tempStatus
        
        // 如果是最后一个cell,并且上拉加载菊花没有动画,上拉加载更多数据
        if indexPath.row == status!.count - 1 && !pullUpView.isAnimating() {
            //        print("上拉加载数据")
            pullUpView.startAnimating()
            // 加载数据
            loadData()
        }
        
        return cell
    }
    
    
    /// 显示下拉刷新加载了多少条微博
    private func showTipView(count: Int) {
        let tipLabelHeight: CGFloat = 44
        let tipLabel = UILabel()
        tipLabel.frame = CGRect(x: 0, y: -20 - tipLabelHeight, width: UIScreen.mainScreen().bounds.width, height: tipLabelHeight)
        
        tipLabel.textColor = UIColor.whiteColor()
        tipLabel.backgroundColor = UIColor.orangeColor()
        tipLabel.font = UIFont.systemFontOfSize(16)
        tipLabel.textAlignment = NSTextAlignment.Center
        
        tipLabel.text = count == 0 ? "没有新的微博" : "加载了 \(count) 条微博"
        
        // 导航栏是从状态栏下面开始
        // 添加到导航栏最下面
        navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
        
        let duration = 0.75
        // 开始动画
        UIView.animateWithDuration(duration, animations: { () -> Void in
            // 让动画反过来执行
            //            UIView.setAnimationRepeatAutoreverses(true)
            
            // 重复执行
            //            UIView.setAnimationRepeatCount(5)
            tipLabel.frame.origin.y = tipLabelHeight
            }) { (_) -> Void in
                
                UIView.animateWithDuration(duration, delay: 0.3, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                    tipLabel.frame.origin.y = -20 - tipLabelHeight
                    }, completion: { (_) -> Void in
                        tipLabel.removeFromSuperview()
                })
        }
    }
//    cell的高度
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        let statue = status![indexPath.row]
        let cell = tableView.dequeueReusableCellWithIdentifier(statue.cellID()) as? HJStatusCell
        
        let rowHeigh = cell!.rowHeight(statue)
        return rowHeigh
    }
    
    // MARK: - 懒加载
    /// 上拉加载更多数据显示的菊花
    private lazy var pullUpView: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        
        indicator.color = UIColor.magentaColor()
        
        return indicator
        }()
}
